package co.gov.medellin.ssti.sub.model.dao;

import java.util.Collection;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.model.vo.BeneficiarioVO;
import co.gov.medellin.ssti.sub.model.vo.BeneficioVO;

public interface BeneficiarioDAO {
	/**
	 * 
	 * @param criteria
	 * @return @
	 */
	Collection<BeneficiarioVO> findBeneficiarioMEL(BeneficiarioVO criteria);

	/**
	 * 
	 * @param criteria
	 * @return @
	 */
	Collection<BeneficiarioVO> findBeneficiarioSisben(BeneficiarioVO criteria);

	/**
	 * Obtiene el grupo familiar de un integrante del sistema SISBEN3, a partir
	 * de su tipo y numero de documento, estos valores deben ser numericos que
	 * es como estan registrados en el SISBEN, pero se envian como un String.
	 * 
	 * @param tipoDoc
	 *            Tipo de documento del integrante del grupo familiar.
	 * @param numDoc
	 *            Numero de documento del integrante del grupo familiar.
	 * @return Collection de BeneficiarioVO con las personas que pertenecen al
	 *         grupo familiar. @ Si falla la ejecucion del query por tipos de
	 *         parametros o problemas en la base de datos.
	 * @throws SUBException
	 *             Por la falla en alguna conexion con el API.
	 */
	Collection<BeneficiarioVO> findGrupoFamiliarSisben(String tipoDoc,
			String numDoc);

	/**
	 * 
	 * @param criteria
	 * @param strOrigen
	 * @return @
	 */
	Collection<BeneficiarioVO> findBeneficiarioByCriteria(
			BeneficiarioVO criteria, String strOrigen);

	/**
	 * Metodo.
	 * 
	 * @param criteria
	 * @param strOrigen
	 * @param codePrograma
	 * @param codeSubprograma
	 * @return @
	 */
	Collection<BeneficiarioVO> findBeneficiarioByCriteria(
			BeneficiarioVO criteria, String strOrigen, Long codePrograma,
			Long codeSubprograma);

	/**
	 * 
	 * @param criteria
	 * @return @
	 */
	int update(BeneficiarioVO criteria);

	/**
	 * 
	 * @param criteria
	 * @return @
	 */
	Collection<BeneficiarioVO> findCabezasGrupoFamiliar(BeneficiarioVO criteria);

	/**
	 * 
	 * @param criteria
	 * @return @
	 */
	Collection<BeneficiarioVO> findGrupoFamiliar(BeneficiarioVO criteria);

	/**
	 * 
	 * @param codeBeneficiario
	 * @return @
	 */
	String findEdad(Long codeBeneficiario);

	/**
	 * 
	 * @param criteria
	 * @return @
	 */
	String[] insert(BeneficiarioVO criteria);

	/**
	 * Metodo que consulta en VCS_BENEFICIOS_OTORGADOS para obtener los
	 * beneficios otorgados al beneficiario.
	 * 
	 * @param codeBeneficiario
	 *            Codigo del beneficiario.
	 * @return Collecion de BeneficioVO. @
	 */
	Collection<BeneficioVO> findBeneficiosByCodBen(Long codeBeneficiario);

	/**
	 * Metodo que consulta en VCS_BENEFICIOS_OTORGADOS los ultimos beneficios
	 * otorgados al beneficiario.
	 * 
	 * @param codeBeneficiario
	 *            Codigo del beneficiario.
	 * @return Collecion de BeneficioVO. @
	 */
	Collection<BeneficioVO> findUltimosBeneficios(Long codeBeneficiario);

	/**
	 * Metodo que realiza un borrado logico del beneficiario. Se realiza un
	 * update en TCS_BEN_BENEFICIARIO: CAMPO_A1 = 'S', usuario_modifica = "WEB="
	 * + terminal, fecha_modifica = fecha.
	 * 
	 * @param codeBeneficiario
	 *            Codigo del beneficiario.
	 * @param user
	 *            Usuario que llama el metodo.
	 * @param terminal
	 *            Terminal desde donde se llama el metodo.
	 * @param fecha
	 *            Fecha en la cual se llama el metodo.
	 * @return true si se realiza el update.
	 */
	boolean delete(Long codeBeneficiario, String user, String terminal,
			String fecha);

	/**
	 * 
	 * @param codeBeneficiario
	 * @param codeBeneficio
	 * @param user
	 * @param terminal
	 * @param fecha
	 * @return @
	 */
	boolean deleteBeneficio(Long codeBeneficiario, Long codeBeneficio,
			String user, String terminal, String fecha);

	/**
	 * Metodo para consultar si un beneficiario esta en la tabla
	 * TCS_BEN_BENEF_GRUPO_FAMILIAR.
	 * 
	 * @param codigoBeneficiario
	 *            Codigo del beneficiario.
	 * @param codigoGrupoFamiliar
	 *            Codigo del grupo familiar.
	 * @return true si esta asignado al grupo familiar. @
	 */
	boolean isBeneficiarioAsignadoAGrupoFamiliar(Long codigoBeneficiario,
			Long codigoGrupoFamiliar);

	/**
	 * Metodo que consulta en VCS_BENEFICIOS_OTORGADOS para determinar si el
	 * beneficiario tiene beneficios del subprograma con codigo codeSubprograma.
	 * 
	 * @param codeBeneficiario
	 *            Codigo del beneficiario.
	 * @param codeSubprograma
	 *            Codigo del subprograma.
	 * @return true si el beneficiario tiene beneficios de ese subprograma.
	 *         false en caso contrario. @
	 */
	boolean isBeneficiarioSubprograma(Long codeBeneficiario,
			Long codeSubprograma);

	/**
	 * Metodo que retorna BEN_CODIGO del registro en TCS_BEN_BENEFICIO_OTORGADO
	 * con codigo = codeBOT.
	 * 
	 * @param codeBOT
	 *            Codigo del beneficio otorgado.
	 * @return Codigo del beneficiario.
	 */
	Long findCodeBeneficiarioByCodeBOT(Long codeBOT);
}
